import createVanilla from 'zustand/vanilla'
import create from 'zustand'
import { MicProps, MtProp, SpeakerProps } from './interface'
import { GetMtInfoReturnProps } from '@/api/manager/mccMtInfo/interface'

export interface ReSetNtfDataProps {
	a_rcv_chn: {
		/**音视频源终端信息 */
		src?: string
		/**音视频源类型
                    1-终端;
                    2-画面合成;
                    3-混音; */
		src_type?: number
		/**音量 */
		volume?: number
	}[]
	a_snd_chn: {
		/**音视频源终端信息 */
		src?: string
		/**音视频源类型
                    1-终端;
                    2-画面合成;
                    3-混音; */
		src_type?: number
		/**音量 */
		volume?: number
	}[]
	/**终端呼叫码率，不可超过会议码率，默认为会议码率 */
	bitrate: number
	/**	呼叫间隔(秒) */
	call_interval: number
	/**int 呼叫模式
            0-仅手动;
            2-仅自动;
            9-手动+追呼;
            10-自动+ 追呼; */
	call_mode: number
	/**呼叫次数 */
	call_times: number
	mt: {
		account: string
		/**帐号类型
                1-moid;
                4-非系统邮箱;
                5-e164号;
                6-电话;
                7-ip地址;
                8-别名@ip(监控前端); */
		account_type: number
		/**终端呼叫码率，不可超过会议码率，默认为会议码率 */
		bitrate: number
		/**int 呼叫模式
            0-仅手动;
            2-仅自动;
            9-手动+追呼;
            10-自动+ 追呼; */
		call_mode: number
		/** int:终端呼叫类型
                1-IP;
                2-E164;
                3-323别名;
                6-电话;
                9-SIP别名;*/
		call_type: number
		/**级联树ID */
		cascade_id: string
		chairman: number
		/** 所属会议e164号，级联会议时为本级会议e164号*/
		conf_e164: string
		/**会议等级，0—16 数字越大会议等级越高 */
		conf_level: number
		/**是否数据会议协作方  0-否1-是*/
		dcs_oper: number
		/**成为发言人后立即发起内容共享，默认为0    0-否1-是*/
		doubleflow: number
		e164: string
		/**是否有协作权限  0-否1-是 */
		enable_dcs: number
		/**是否强制广播  0-否1-是*/
		force_brd: number
		/**是否互动终端   0-否1-是*/
		interactive_mt: number
		/**是否外设终端 0-否1-是*/
		is_seqp_mt: number
		mix: number
		moid: string
		mt_id: string
		mt_ip: string
		mt_key: string
		/**终端类型1-普通终端3-电话终端 */
		mt_type: number
		/**是否终端自主多画面 0-否1-是*/
		mt_vmp: number
		/**是否哑音 0-否1-是*/
		mute: number
		name: string
		/**	是否在线
                0-不在线;
                1-在线; */
		online: number
		/**是否开启轮询
                0-否;
                1-是; */
		poll: number
		portrait: ''
		/**是否录像
                0-否;
                1-是; */
		rec: number
		/**会议密级 0-未定义 1-公开 2-内部3-秘密4-机密*/
		security_level: number
		/**是否开启选看  0-否1-是*/
		select: number
		/**通道是否静音  0-否1-是*/
		silence: number
		/**
		 * 是否主讲0-否1-是;
		 */
		speaker: number
		/**是否多流0-否 1-是; */
		stream: number
		tvwall: number
		/**是否上传终端  0-否1-是*/
		up_mt: number
		/**
		 * 是否vip0-否1-是;
		 */
		vip: number
		/**自主多画面 */
		vmp: number
	}
	/**呼叫协议 */
	protocol: string
	v_rcv_chn: {
		/**音视频源终端信息 */
		src?: string
		/**音视频源类型
                    1-终端;
                    2-画面合成;
                    3-混音; */
		src_type?: number
		/**音量 */
		volume?: number
	}[]
	v_snd_chn: {
		/**音视频源终端信息 */
		src?: string
		/**音视频源类型
                    1-终端;
                    2-画面合成;
                    3-混音; */
		src_type?: number
		/**音量 */
		volume?: number
	}[]
}
interface UpdateMtInfoProps {
	mtid: string
	mute: number
	silence: number
}
type MccMtInfoStore = StateType & {
	reset: () => void
	reSetNtf: (data: ReSetNtfDataProps) => void
	setMt: (mt: MtProp) => void
	setMtInfo: (mtInfo: GetMtInfoReturnProps | undefined) => void
	setMic: (mic: Partial<MicProps>) => void
	setSpeaker: (speaker: Partial<SpeakerProps>) => void
	updateMtInfo: (_mt: UpdateMtInfoProps) => void
}
type StateType = {
	cometdMccMtInfo: ReSetNtfDataProps | null
	mt: MtProp
	mtInfo: GetMtInfoReturnProps | undefined
	mic: MicProps
	speaker: SpeakerProps
}

const initialState: StateType = {
	cometdMccMtInfo: null,
	mt: {
		isMt: true,
		mtKey: '',
		mtid: '',
		confLevel: 2,
		e164: '',
		interactiveMt: 0,
	},
	mtInfo: undefined,
	/**麦克风 */
	mic: { isMute: 0, value: 0, changeValue: 0 },
	/**扬声器 */
	speaker: { isSilence: 0, value: 0, changeValue: 0 },
}
export const store = createVanilla<MccMtInfoStore>((set, get) => ({
	...initialState,
	reset: () => set(initialState),
	reSetNtf: (data) => {
		set({ cometdMccMtInfo: data })
	},
	setMt: (mt) => {
		set({ mt })
	},
	setMtInfo: (mtInfo) => {
		set({ mtInfo })
	},
	setMic: (mic) => {
		set({ mic: { ...get().mic, ...mic } })
	},
	setSpeaker: (speaker) => {
		set({ speaker: { ...get().speaker, ...speaker } })
	},
	updateMtInfo: (_mt) => {
		if (_mt.mtid === get().mtInfo?.mt_id) {
			let newMic = {
				...get().mic,
				isMute: _mt.mute,
			}
			set({ mic: newMic })
			let newSpeaker = {
				...get().speaker,
				isMute: _mt.silence,
			}
			set({ speaker: newSpeaker })
		}
	},
}))
export const useMccMtInfoStore = create(store)
